From de50012371233e11e439a2e592d765b0dbfcc453 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Florian=20M=C3=BCllner?= Date: Fri, 23 Oct 2015 22:43:11 +0200 Subject: [PATCH] listbox: Implement :focus-on-click Similar to buttons-in-toolbars, it can make sense for listbox rows to not take away the focus from the main application view, for instance when used for navigation. Support this by taking the newly added GtkWidget:focus-on-click property into account. https://bugzilla.gnome.org/show_bug.cgi?id=757269 --- gtk/gtklistbox.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index 66281f813a..14fe248836 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -1618,15 +1618,18 @@ gtk_list_box_select_all_between (GtkListBox *box, } } +#define gtk_list_box_update_selection(b,r,m,e) \ + gtk_list_box_update_selection_full((b), (r), (m), (e), TRUE) static void -gtk_list_box_update_selection (GtkListBox *box, - GtkListBoxRow *row, - gboolean modify, - gboolean extend) +gtk_list_box_update_selection_full (GtkListBox *box, + GtkListBoxRow *row, + gboolean modify, + gboolean extend, + gboolean grab_cursor) { GtkListBoxPrivate *priv = BOX_PRIV (box); - gtk_list_box_update_cursor (box, row, TRUE); + gtk_list_box_update_cursor (box, row, grab_cursor); if (priv->selection_mode == GTK_SELECTION_NONE) return; @@ -1699,14 +1702,17 @@ gtk_list_box_activate (GtkListBox *box, g_signal_emit (box, signals[ROW_ACTIVATED], 0, row); } +#define gtk_list_box_select_and_activate(b,r) \ + gtk_list_box_select_and_activate_full ((b), (r), TRUE) static void -gtk_list_box_select_and_activate (GtkListBox *box, - GtkListBoxRow *row) +gtk_list_box_select_and_activate_full (GtkListBox *box, + GtkListBoxRow *row, + gboolean grab_focus) { if (row != NULL) { gtk_list_box_select_row_internal (box, row); - gtk_list_box_update_cursor (box, row, TRUE); + gtk_list_box_update_cursor (box, row, grab_focus); gtk_list_box_activate (box, row); } } @@ -1898,11 +1904,13 @@ gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gesture, if (priv->active_row != NULL && priv->active_row_active) { + gboolean focus_on_click = gtk_widget_get_focus_on_click (GTK_WIDGET (box)); + gtk_widget_unset_state_flags (GTK_WIDGET (priv->active_row), GTK_STATE_FLAG_ACTIVE); if (n_press == 1 && priv->activate_single_click) - gtk_list_box_select_and_activate (box, priv->active_row); + gtk_list_box_select_and_activate_full (box, priv->active_row, focus_on_click); else { GdkEventSequence *sequence; @@ -1923,7 +1931,7 @@ gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gesture, if (source == GDK_SOURCE_TOUCHSCREEN) modify = !modify; - gtk_list_box_update_selection (box, priv->active_row, modify, extend); + gtk_list_box_update_selection_full (box, priv->active_row, modify, extend, focus_on_click); } } -- 2.30.2